package LuMin.atomic_demo;

import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author lumin
 * @date 2022/05/08 09:55
 **/
public class Main {
    static int i = 0;

    static AtomicInteger j = new AtomicInteger(0);

    public static void main(String[] args) {
        // 不是原子的，想做到原子，就需要进行加锁操作
        // 但加锁这个动作，其实成本是挺高的
        i++;
        i--;

        // JVM 保证了这些操作是原子的，并且实现原子时，没有用到锁
        // 整体来讲，性能能好些
        // 内存其实通过 CAS + 多次尝试实现
        // j = 0   CAS(j, 0, 1)，成功了，原子操作成功；失败了，再次尝试  CAS(j, 1, 2)
        j.getAndIncrement();    // 先取值，后加 1，视为是 j++
        j.getAndDecrement();    // 先取值，后减 1，视为是 j--
        j.incrementAndGet();    // ++j
        j.getAndAdd(5);     // d = j; j = j + 5
    }
}